package com.qinggeng.project.system.mapper;

import com.qinggeng.project.api.dto.GiftReturn;
import com.qinggeng.project.api.dto.OrdersDistDto;
import com.qinggeng.project.system.domain.OrderStatistics;
import com.qinggeng.project.system.domain.Orders;
import com.qinggeng.project.system.domain.PrintData;
import com.qinggeng.project.system.domain.vo.OrderLineVo;
import com.qinggeng.project.system.domain.vo.OrderStatifyVo;
import com.qinggeng.project.system.domain.vo.OrderStatisticsVO;
import com.qinggeng.project.system.domain.vo.OrdersSingleGoodsReturnVO;
import com.qinggeng.project.system.dto.OrderStatisticsDTO;
import com.qinggeng.project.system.dto.OrdersSingleGoodsReturnDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;
import tk.mybatis.mapper.common.Mapper;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 订单列Mapper接口
 *
 * @author qinggeng
 * @date 2020-06-17
 */
public interface OrdersMapper  {
    /**
     * 查询订单列
     *
     * @param ordersId 订单列ID
     * @return 订单列
     */
    public Orders selectOrdersById(Long ordersId);

    /**
     * 根据订单Id和用户Id查询订单
     * @param ordersId
     * @param userId
     * @return
     */
    Orders selectOrdersByIdAndUserId(Long ordersId,Long userId);

    /**
     * 查询订单列列表
     *
     * @param orders 订单列
     * @return 订单列集合
     */
    public List<Orders> selectOrdersList(Orders orders);

    List<Orders> listOrdersByTime(Orders orders);


    public List<Orders> selectOrdersReturnList(Orders orders);


    /**
     * 新增订单列
     *
     * @param orders 订单列
     * @return 结果
     */
    public int insertOrders(Orders orders);

    /**
     * 修改订单列
     *
     * @param orders 订单列
     * @return 结果
     */
    public int updateOrders(Orders orders);

    /**
     * 删除订单列
     *
     * @param ordersId 订单列ID
     * @return 结果
     */
    public int deleteOrdersById(Long ordersId);

    /**
     * 批量删除订单列
     *
     * @param ordersIds 需要删除的数据ID
     * @return 结果
     */
    public int deleteOrdersByIds(Long[] ordersIds);

    Orders selectOrdersByOrdersNo(java.lang.String ordersNo);

    int selectPayStatusSuccess(String ordersNo);

    int selectOrdersCount(Orders where);

    List<OrdersDistDto> selectOrdersDiscDtoList(@Param("status") Integer status, @Param("lng") Float lng, @Param("lat") Float lat,@Param("pointId") Long pointId);

    List<OrderStatistics> statisticsOderEveryInCome();

    int selectOrdersDiscDtoCount(@Param("pointId") Long pointId,@Param("status") Integer status,@Param("startTime") Long startTime,@Param("endTime")Long endTime);


    List<OrdersDistDto> selectOrdersDiscDtoUserList(Integer status, Long pointId,Long startTime,Long endTime);

    OrderStatifyVo statifyOrderCountAll();

    OrderStatifyVo orderStatifyToday();

    List<OrderLineVo> statifyOrderLine();

    Orders selectOrdersByDefaultUserId(Long userId);



    /**
     * 根据用户Id计算某时间段内的未退款的订单总额
     * @param userId
     * @param startTime
     * @param endTime
     * @return
     */
    BigDecimal getOrdersTotalPrice(@Param("userId") Long userId, @Param("startTime") Date startTime,@Param("endTime") Date endTime);


    List<PrintData> selectPrintDataList(Long shopId);

    /**
     * 获取订单打印状态
     * @param orders
     * @return
     */
    String getOrdersPrintStatus(Orders orders);


    /**
     * 根据userid 统计下单 个数
     * @param userId
     * @return
     */
    Long getOrdersCountByUserId(Long userId);



    /**
     * 单商品退款时候使用
     * @param
     * @return
     */
   int ordersSingleRefund(Orders orders);


    /**
     * 单商品退款列表
     * @param
     * @return
     */
    List<OrdersSingleGoodsReturnVO> selectOrdersSingleGoodsReturnList(OrdersSingleGoodsReturnDTO dto);

    int ordersDistAutoTake(String ordersNo);

    int updateOrdersPrintStatus(Orders updateOrders);

    List<String> listOrdersNoByTime(@Param("startTime") String startTime,@Param("endTime") String endTime);

    int updateOrdersPayment(Orders orders);

    int updateOrdersPointCommission(@Param("ordersId")Long orderId,@Param("distributionFee")String distributionFee ,@Param("pointCommission")String pointCommission);

    List<OrderStatisticsVO> listOrderStatistics(OrderStatisticsDTO dto);

    int updatePaymentOnBehalfOfType(String ordersNo);

}
